home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 9 / The PC-SIG Library on CD ROM - Ninth Edition.iso / 501_600 / DISK0579 / DISK0579.ZIP / CHAP08.TXT < prev    next >
Text File  |  1989-12-01  |  12KB  |  296 lines

  1.  
  2.  
  3.  
  4.                                                     Chapter 8
  5.                                  SCALARS, SUBRANGES, AND SETS
  6.  
  7.  
  8. PASCAL SCALARS
  9. ____________________________________________________________
  10.  
  11. A scalar, also called an enumerated type,   =================
  12. is a list of values which a variable of        ENTYPES.PAS
  13. that type may assume.  Look at the Pascal   =================
  14. program ENTYPES.PAS for an example of some
  15. scalars.  The first type declaration
  16. defines Days as being a type which can take on any one of
  17. seven values.  Since, within the var declaration, Day is
  18. assigned the type of Days, then Day is a variable which can
  19. assume any one of seven different values.  Moreover Day can
  20. be assigned the value Mon, or Tue, etc., which is considerably
  21. clearer than using 0 to represent Monday, 1 for Tuesday, etc. 
  22. This makes the program easier to follow and understand.  
  23.  
  24. Internally, Pascal does not actually assign the value Mon to
  25. the variable Day, but it uses an integer representation for
  26. each of the names.  This is important to understand because
  27. you need to realize that you cannot print out Mon, Tue, etc.,
  28. but can only use them for indexing control statements.
  29.  
  30. The second line of the type definition defines Time_Of_Day as
  31. another scalar which can have any of four different values,
  32. namely those listed.  The variable Time can only be assigned
  33. one of four values since it is defined as the type
  34. Time_Of_Day.  It should be clear that even though it can be
  35. assigned Morning, it cannot be assigned Morning_time or any
  36. other variant spelling of Morning, since it is simply another
  37. identifier which must have an exact spelling to be understood
  38. by the compiler.  Several real variables are defined to allow
  39. us to demonstrate the use of the scalar variables.  After
  40. writing a header in lines 16 through 20, the real variables
  41. are initialized to some values that are probably not real life
  42. values, but will serve to illustrate the scalar variable.
  43.  
  44.  
  45. A BIG SCALAR VARIABLE LOOP
  46. ____________________________________________________________
  47.  
  48. The remainder of the program is one large loop being
  49. controlled by the variable Day as it goes through all of its
  50. values, one at a time.  Note that the loop could have gone
  51. from Tue to Sat or whatever portion of the range desired, it
  52. does not have to go through all of the values of Day.  Using
  53. Day as the case variable, the name of one of the days of the
  54. week is written out each time we go through the loop.  Another
  55. loop controlled by Time is executed four times, once for each
  56. value of Time.  The two case statements within the inner loop
  57. are used to calculate the total pay rate for each time period
  58.  
  59.                                                      Page 8-1
  60.  
  61.                                  Scalars, Subranges, and Sets
  62.  
  63. and each day.  The data is formatted carefully to make a nice
  64. looking table of pay rates as a function of Time and Day.
  65.  
  66. Take careful notice of the fact that the scalar variables
  67. never entered into the calculations, and they were not printed
  68. out.  They were only used to control the flow of logic.  It
  69. was much neater than trying to remember that Mon is
  70. represented by a 0, Tue is represented by a 1, etc.  In fact,
  71. those numbers are used for the internal representation of the
  72. scalars but we can relax and let Pascal worry about the
  73. internal representation of our scalars.  Compile and run this
  74. program and observe the output.
  75.  
  76.  
  77. LET'S LOOK AT SOME SUBRANGES
  78. ____________________________________________________________
  79.  
  80. Examine the program SUBRANGE.PAS for an      ================
  81. example of subranges and some additional       SUBRANGE.PAS
  82. instruction on scalar variables.  It may     ================
  83. be expedient to define some variables that
  84. only cover a part of the full range as
  85. defined in a scalar type.  Notice that Days is declared a
  86. scalar type as in the last program, and Work is declared a
  87. type with an even more restricted range.  In the var
  88. declaration, Day is once again defined as the days of the week
  89. and can be assigned any of the days by the program.  The
  90. variable Workday, however, is assigned the type Work, and can
  91. only be assigned the days Mon through Fri.  If an attempt is
  92. made to assign Workday the value Sat, a run-time error will
  93. be generated.  A carefully written program will never attempt
  94. that, and it would be an indication that something is wrong
  95. with either the program or the data.  This is one of the
  96. advantages of Pascal over older languages and is a reason for
  97. the relatively strong type checking built into the language.
  98.  
  99. Further examination will reveal that Index is assigned the
  100. range of integers from 1 through 12.  During execution of the
  101. program, if an attempt is made to assign Index any value
  102. outside of that range, a run time error will be generated. 
  103. Suppose the variable Index was intended to refer to your
  104. employees, and you have only 12.  If an attempt was made to
  105. refer to employee number 27, or employee number -8, there is
  106. clearly an error somewhere in the data and you would want to
  107. stop running the payroll to fix the problem.  Pascal would
  108. have saved you a lot of grief.
  109.  
  110.  
  111.  
  112. SOME STATEMENTS WITH ERRORS IN THEM.
  113. ____________________________________________________________
  114.  
  115. In order to have a program that would compile without errors,
  116. and yet show some errors, the section of the program in lines
  117.  
  118.                                                      Page 8-2
  119.  
  120.                                  Scalars, Subranges, and Sets
  121.  
  122. 16 through 27 is not really a part of the program since it is
  123. within a comment area.  This is a trick to remember when you
  124. are debugging a program, a troublesome part can be commented
  125. out until you are ready to include it with the rest of the
  126. code.  The errors are self explanatory and it would pay for
  127. you to spend enough time to understand each of the errors.
  128.  
  129. There are seven assignment statements as examples of subrange
  130. variable use in lines 29 through 35.  Notice that the variable
  131. Day can always be assigned the value of either Workday or
  132. Weekend, but the reverse is not true because Day can assume
  133. values that would be illegal to assign to the others.
  134.  
  135.  
  136.  
  137. THREE VERY USEFUL FUNCTIONS
  138. ____________________________________________________________
  139.  
  140. Lines 37 through 42 of the example program demonstrate the use
  141. of three very important functions when using scalars.  The
  142. first is the Succ function that returns the value of the
  143. successor to the scalar used as an argument, the next value. 
  144. If the argument is the last value, a run time error is
  145. generated.  The next function is the Pred function that
  146. returns the predecessor to the argument of the function. 
  147. Finally the Ord function which returns the ordinal value of
  148. the scalar.  
  149.  
  150. All scalars have an internal representation starting at 0 and
  151. increasing by one until the end is reached.  In our example
  152. program, Ord(Day) is 5 if Day has been assigned Sat, but
  153. Ord(Weekend) is 0 if Weekend has been assigned Sat.  As you
  154. gain experience in programming with scalars and subranges, you
  155. will realize the value of these three new functions.
  156.  
  157. A few more thoughts about subranges are in order before we go
  158. on to another topic.  A subrange is always defined by two
  159. predefined constants, and is always defined in an ascending
  160. order.  A variable defined as a subrange type is actually a
  161. variable defined with a restricted range.  Good programming
  162. practice would dictate that subranges should be used as often
  163. as possible in order to prevent garbage data.  There are
  164. actually very few variables ever used that cannot be
  165. restricted by some amount.  The limits may give a hint at what
  166. the program is doing and can help in understanding the program
  167. operation.  Subrange types can only be constructed using the
  168. simple types, integer, char, byte, or scalar.
  169.  
  170. Compile and run this program even though it has no output. 
  171. Add some output statements to see what values some of the
  172. variables assume.
  173.  
  174.  
  175.  
  176.  
  177.                                                      Page 8-3
  178.  
  179.                                  Scalars, Subranges, and Sets
  180.  
  181. SETS
  182. ____________________________________________________________
  183.  
  184. Now for a new topic, sets.  Examining the    ================
  185. example Pascal program SETS.PAS will             SETS.PAS
  186. reveal some sets.  A scalar variable is      ================
  187. defined first, in this case the scalar
  188. type named Goodies.  A set is then defined
  189. with the reserved words set of followed by a predefined scalar
  190. type.  Several variables are defined as sets of Treat, after
  191. which they can individually be assigned portions of the entire
  192. set.
  193.  
  194. Consider the variable Ice_Cream_Cone which has been defined
  195. as a set of type Treat.  This variable is composed of as many
  196. elements of Goodies as we care to assign to it.  In the
  197. program, we define it as being composed of Ice_Cream, and
  198. Cone.  The set Ice_Cream_Cone is therefore composed of two
  199. elements, and it has no numerical or alphabetic value as most
  200. other variables have.  
  201.  
  202. In lines 21 through 26, you will see 4 more delicious deserts
  203. defined as sets of their components.  Notice that the banana
  204. split is first defined as a range of terms, then another term
  205. is added to the group illustrating how you can add to a set. 
  206. All five are combined in the set named Mixed, then Mixed is
  207. subtracted from the entire set of values to form the set of
  208. ingredients that are not used in any of the deserts.  Each
  209. ingredient is then checked to see if it is in the set of
  210. unused ingredients, and printed out if it is.  Note that in
  211. is another reserved word in Pascal.  Running the program will
  212. reveal a list of unused elements.
  213.  
  214. In this example, better programming practice would have
  215. dictated defining a new variable, possibly called Remaining
  216. for the ingredients unused in line 32.  It was desirable to
  217. illustrate that Mixed could be assigned a value based on
  218. subtracting itself from the entire set, so the poor variable
  219. name was used.
  220.  
  221. When you compile and run this program you will see that this
  222. example results in some nonsense results but hopefully it led
  223. your thinking toward the fact that sets can be used for
  224. inventory control, possibly a parts allocation scheme, or some
  225. other useful system.
  226.  
  227.  
  228. SEARCHING WITH SETS
  229. ____________________________________________________________
  230.  
  231. The Pascal program FINDCHRS.PAS is more useful than the last
  232. one.  In it we start with a short sentence and search it for
  233. all lower case alphabetic letters and write a list of those
  234. used.  Since we are using a portion of the complete range of
  235.  
  236.                                                      Page 8-4
  237.  
  238.                                  Scalars, Subranges, and Sets
  239.  
  240. char, we do not need to define a scalar      ================
  241. before defining the set, we can define the     FINDCHRS.PAS
  242. set using the range 'a'..'z'.  The set       ================
  243. Data_Set is assigned the value of no
  244. elements in the first statement of the
  245. program, and the print string, named Print_Group, is set to
  246. blank in the next.  The variable Storage is assigned the
  247. sentence to search, and the search loop is begun.  Each time
  248. through the loop, one of the characters is checked.  It is
  249. either declared as a non-lower-case character, as a repeat of
  250. one already found, or as a new character to be added to the
  251. list.
  252.  
  253. You are left to decipher the details of the program, which
  254. should be no problem since there is nothing new here.  Run the
  255. program and observe how the list grows with new letters as the
  256. sentence is scanned.
  257.  
  258.  
  259. PROGRAMMING EXERCISE
  260. ____________________________________________________________
  261.  
  262. 1.   Modify FINDCHRS.PAS to search for upper-case letters.
  263.  
  264.  
  265.  
  266.  
  267.  
  268.  
  269.  
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.  
  280.  
  281.  
  282.  
  283.  
  284.  
  285.  
  286.  
  287.  
  288.  
  289.  
  290.  
  291.  
  292.  
  293.  
  294.  
  295.                                                      Page 8-5
  296.